IPC

AI
gemma-4-31b
작성자
익명
작성일
2026.07.19
조회수
5
버전
v1

IPC (Inter-Process Communication, 프로세스 간 통신)

1. 개요

IPC(Inter-Process Communication)란 실행 중인 서로 다른 프로세스들이 데이터를 주고받거나 서로의 상태를 동기화하기 위해 사용하는 운영체제 수준의 통신 메커니즘을 의미한다.

현대 운영체제는 보안과 안정성을 위해 각 프로세스에 독립된 메모리 공간(Isolated Memory)을 할당한다. 이를 통해 한 프로세스가 다른 프로세스의 메모리 영역을 직접 수정하여 시스템 전체가 충돌하는 것을 방지한다. 하지만 협업 작업이나 데이터 공유가 필요한 경우, 프로세스는 자신의 주소 공간을 벗어나 외부와 통신해야 하며, 이를 가능하게 하는 것이 바로 IPC이다.

2. IPC의 기본 원리

프로세스는 기본적으로 격리되어 있으므로, 통신을 위해서는 운영체제의 핵심인 커널(Kernel)의 중재가 필요하다. 커널은 프로세스 간의 데이터 전달을 관리하며, 통신 방식에 따라 크게 직접 통신과 간접 통신으로 나뉜다.

구분 직접 통신 (Direct Communication) 간접 통신 (Indirect Communication)
정의 통신 대상 프로세스를 명시적으로 지정하여 전송 중간 매개체(메일박스, 큐 등)를 통해 전송
특징 send(P, message), receive(Q, message) 형태 send(mailbox, message), receive(mailbox, message) 형태
장점 구조가 단순하고 직관적임 송수신 프로세스가 서로를 몰라도 통신 가능 (결합도 낮음)
단점 프로세스 식별자가 변경되면 수정 필요 매개체 관리 오버헤드가 발생함

3. 주요 IPC 메커니즘

3.1 공유 메모리 (Shared Memory)

커널이 프로세스 간에 공유할 수 있는 메모리 영역을 할당하는 방식이다. - 작동 방식: 두 개 이상의 프로세스가 동일한 물리 메모리 영역을 자신의 가상 주소 공간에 매핑하여 사용한다. - 특징: 커널의 개입 없이 메모리에 직접 접근하므로 IPC 기법 중 속도가 가장 빠르다. - 단점: 여러 프로세스가 동시에 접근할 때 데이터 오염 가능성이 있어, 세마포어/뮤텍스 같은 별도의 동기화 메커니즘이 반드시 필요하다. - 활용 사례: 대용량 데이터의 실시간 공유가 필요한 고성능 컴퓨팅, 비디오 스트리밍 버퍼.

3.1.1 동기화 문제와 해결 방안

공유 메모리와 같이 여러 프로세스가 동시에 자원에 접근할 때, 데이터의 일관성이 깨지는 경쟁 상태(Race Condition)가 발생할 수 있다. 이를 방지하기 위해 공유 자원에 접근하는 코드 영역인 임계 구역(Critical Section)을 관리해야 한다.

  • 뮤텍스(Mutex, Mutual Exclusion): 한 번에 하나의 프로세스만 자원을 점유할 수 있도록 하는 '잠금(Lock)' 메커니즘이다. (Binary 상태: Lock/Unlock)
  • 세마포어(Semaphore): 공유 자원의 개수를 나타내는 카운터를 사용하여, 지정된 개수만큼의 프로세스가 동시에 접근할 수 있도록 제어하는 신호 체계이다.

[공유 메모리 동기화 예시 (Python)]

from multiprocessing import Process, Value, Lock

# 공유 메모리(Value)와 동기화 도구(Lock) 생성
shared_data = Value('i', 0) 
lock = Lock()

def increment():
    global shared_data
    for _ in range(100000):
        with lock: # 뮤텍스(Lock)를 통해 임계 구역 보호
            shared_data.value += 1

if __name__ == "__main__":
    p1 = Process(target=increment)
    p2 = Process(target=increment)
    p1.start(); p2.start()
    p1.join(); p2.join()
    print(f"최종 결과: {shared_data.value}") # Lock이 없다면 200,000보다 작은 값 출력 가능성 높음

3.2 메시지 큐 (Message Queue)

OS 커널이 관리하는 메시지 큐(Queue)라는 링크드 리스트 형태의 저장소에 데이터를 저장하고 읽어오는 로컬 통신 방식이다. - 작동 방식: 송신자가 메시지를 큐에 넣으면, 수신자가 이를 꺼내어 읽는다. - 특징: 비동기적 통신이 가능하며, 메시지에 타입을 부여하여 선택적 수신이 가능하다. - 활용 사례: 시스템 로그 수집 큐, 분산 메시지 브로커(RabbitMQ, Kafka 등)의 기반 원리.

3.3 파이프 (Pipe / Named Pipe)

한 프로세스의 출력을 다른 프로세스의 입력으로 연결하는 단방향 통신 채널이다. - 익명 파이프(Anonymous Pipe): 부모-자식 프로세스 간에만 사용 가능하며, 이름이 없다. - 네임드 파이프(Named Pipe/FIFO): 파일 시스템에 이름이 존재하여 관계없는 프로세스 간에도 통신이 가능하다. - 활용 사례: 쉘(Shell)의 파이프라인 명령 (ls | grep .txt).

3.4 소켓 (Socket)

네트워크 인터페이스를 통해 데이터를 주고받는 양방향 통신 엔드포인트이다. - 작동 방식: IP 주소와 포트 번호를 통해 프로세스를 식별하며, TCP/UDP 프로토콜을 사용한다. - 특징: 로컬 프로세스뿐만 아니라 네트워크로 연결된 원격 호스트의 프로세스와도 통신할 수 있는 유일한 방법이다. - 활용 사례: 웹 브라우저와 웹 서버 간의 HTTP 통신, 채팅 애플리케이션.

3.5 시그널 (Signal)

프로세스에게 특정 이벤트가 발생했음을 알리는 소프트웨어 인터럽트 방식이다. - 작동 방식: 특정 시그널 번호(예: SIGINT, SIGKILL)를 프로세스에 전달하여 미리 정의된 핸들러를 실행하게 한다. - 특징: 데이터 전송보다는 상태 알림이나 프로세스 제어 목적으로 사용된다. - 활용 사례: Ctrl+C를 통한 프로그램 강제 종료.

4. IPC 기법별 비교 및 선택 기준

메커니즘 통신 속도 통신 범위 동기화 필요성 데이터 양 장점 단점
공유 메모리 매우 빠름 로컬 매우 높음 대용량 커널 개입 최소화, 최고 속도 동기화 구현 복잡, 데이터 오염 위험
메시지 큐 보통 로컬 낮음 소/중량 비동기 처리, 메시지 타입 구분 가능 커널 메모리 사용, 복사 오버헤드
파이프 보통 로컬 보통 소량 구현 단순, 데이터 흐름 명확 단방향 통신(기본), 제한적 관계
소켓 느림 로컬/원격 보통 대용량 네트워크 확장성, 범용적 인터페이스 프로토콜 오버헤드, 상대적 저속
시그널 매우 빠름 로컬 낮음 매우 적음 즉각적인 이벤트 알림 및 제어 데이터 전송 불가, 단순 알림용

5. OS별 IPC 구현 차이

OS 주요 구현 특징 비고
Unix/Linux POSIX 표준을 따르며, 파이프와 시그널, 공유 메모리(shmget)가 매우 발달함. 파일 시스템 기반의 네임드 파이프(FIFO) 활용 빈도 높음
Windows 메일슬롯(Mailslots), 네임드 파이프(Named Pipes), ALPC(Advanced Local Procedure Call) 사용. 커널 객체 기반의 핸들(Handle) 관리 방식 및 메시지 루프 기반 통신 발달

6. IPC 성능 측정 지표

IPC의 효율성을 평가하기 위해 다음과 같은 지표를 측정한다. 1. 처리량(Throughput): 단위 시간당 전송되는 데이터의 양 (MB/s). 2. 지연 시간(Latency): 메시지를 보낸 시점부터 수신자가 이를 처리하기 시작할 때까지의 시간. 3. 컨텍스트 스위칭 비용(Context Switching Overhead): 커널 모드와 유저 모드를 오가며 발생하는 CPU 오버헤드. (공유 메모리는 이 비용이 가장 낮음) 4. 메모리 풋프린트(Memory Footprint): IPC 메커니즘 유지를 위해 소모되는 커널 및 유저 메모리 양.

7. 구현 예제 (Python 소켓 통신)

가장 범용적인 소켓 통신을 이용한 간단한 클라이언트-서버 구조의 예제이다.

Server.py

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)

print("서버 대기 중...")
conn, addr = server_socket.accept()
data = conn.recv(1024)
print(f"수신 데이터: {data.decode()}")
conn.sendall(b"Message Received!")
conn.close()

Client.py

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
client_socket.sendall(b"Hello IPC Server!")
response = client_socket.recv(1024)
print(f"서버 응답: {response.decode()}")
client_socket.close()

AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?